home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 September / EnigmA AMIGA RUN 10 (1996)(G.R. Edizioni)(IT)[!][issue 1996-09][EARSAN CD XI].iso / internet / others / wwwcache.lha / Cache / Cache.www < prev    next >
Text File  |  1995-09-28  |  12KB  |  498 lines

  1. /*  $VER: Cache.www 1.4 (28.9.95) Stephan Lichtendahl
  2. Caching of inlined images and HTML documents on harddisk */
  3.  
  4. cachedir='AmiTCP:Cache/'
  5. copycom='Copy Quiet'
  6.  
  7. if ~show(l,'rexxsupport.library') then
  8.   if ~addlib('rexxsupport.library',0,-30,0) then
  9.     exit
  10. if ~show(l,'rexxdossupport.library') then
  11.   if ~addlib('rexxdossupport.library',0,-30,2) then
  12.     exit                                           .
  13.  
  14. hit=0
  15. HTML=''
  16. Image=''
  17. saveto=''
  18. ret='0a'x
  19. OPTIONS RESULTS
  20.  
  21. parse arg args
  22. if ~ReadArgs(args,'Save/S,Load/S,Remove/S,Image/K,HTML/K') then do
  23.   say 'Usage: Cache.www [Save] to get/put images in current AMosaic'
  24.   say 'document from/to cache, Save will save HTML document as well.'
  25.   say 'Cache.www Image/K HTML/K will delete <image> and/or <html> from'
  26.   say 'cache. <image> and <html> can be URLs, filenames or both ALL.'
  27.   say 'Remove will remove the current AMosaic document from cache,'
  28.   say 'and every image in it which is currently visable (ie. loaded).'
  29.   say 'Cache.www Load reloads the current cached document from WWW.'
  30.   return 0
  31. end
  32. if Image ~= '' | HTML ~= '' then do
  33.   if upper(Image) = 'ALL' & upper(HTML) = 'ALL' then
  34.     call AllesWeg
  35.   else do
  36.     if Image ~= '' then do
  37.       type=1
  38.       call WisItem
  39.     end
  40.     if HTML ~= '' then do
  41.       type=0
  42.       call WisItem
  43.     end
  44.   end
  45.   return 0
  46. end
  47.  
  48. if ~Load & ~Remove then do
  49.   address AMOSAIC.1 'fetch images IMAGE'
  50.  
  51.   call open(1input,cachedir'ImageList','R')
  52.   imagelist = readch(1input,65535)
  53.   call close(1input)
  54.  
  55.   do i=1 for image.0
  56.     nieuw.i=0
  57.     urlnaam=image.i.url
  58.     av=image.i.current
  59.  
  60.     if left(urlnaam,17) = 'file://localhost/' then do
  61.       if ~av then
  62.         address AMOSAIC.1 'fetch inline url 'urlnaam
  63.      end
  64.     else do
  65.       nr = pos(urlnaam,imagelist)
  66.  
  67.       if nr = 0 & av then do
  68.         call open(2input,cachedir'NrOfImage','R')
  69.         imgnr = readln(2input)+1
  70.         call close(2input)
  71.  
  72.         address command copycom '"'image.i.filename'"' cachedir'Images/'imgnr
  73.         address command 'Echo >>'cachedir'ImageList "'imgnr','urlnaam'"'
  74.         imagelist=imagelist||imgnr','urlnaam||ret
  75.         nieuw.i=imgnr
  76.  
  77.         call open(2output,cachedir'NrOfImage','W')
  78.         call writeln(2output,imgnr)
  79.         call close(2output)
  80.       end
  81.  
  82.       if nr > 0 then do
  83.         startnr = lastpos(ret,imagelist,nr)+1
  84.         imgnr = substr(imagelist,startnr,nr-startnr-1)
  85.         nieuw.i=imgnr
  86.         if av then
  87.           address command copycom '"'image.i.filename'"' cachedir'Images/'imgnr
  88.         else
  89.           hit=2
  90.       end
  91.  
  92.     end
  93.   end
  94. end
  95.  
  96. address AMOSAIC.1 'get url'
  97. urlnaam = result
  98. if Remove then
  99.   call RemHTML
  100.  
  101. if Load | Save then do
  102.   if left(urlnaam,27) = 'file://localhost/T:temphtml' then
  103.     address AMOSAIC.1 'jump back'
  104.   else do
  105.  
  106.     call open(3input,cachedir'HTMLlist','R')
  107.     htmllist = readch(3input,65535)
  108.     call close(3input)
  109.     dir=cachedir'HTMLs/'
  110.  
  111.     nr = pos(dir,urlnaam)
  112.     if nr > 0 then do
  113.       saveto = substr(urlnaam,nr+length(dir))
  114.       nr = pos(saveto',',htmllist)
  115.       startnr = nr+length(saveto)+1
  116.       stopnr = pos(ret,htmllist,startnr+1)
  117.       urlnaam = substr(htmllist,startnr,stopnr-startnr)
  118.       if Load then
  119.         address AMOSAIC.1 'jump url 'urlnaam
  120.       else
  121.         hit=hit+1
  122.  
  123.      end
  124.     else
  125.       if Save then do
  126.         if left(urlnaam,17) = 'file://localhost/' then do
  127.           address command 'GetString "Local document - change URL for remote links" String "'urlnaam'" Var newurl Global'
  128.           if RC = 0 then
  129.             urlnaam = getvar('newurl')
  130.           call deletevar('newurl')
  131.         end
  132.  
  133.         nr = pos(urlnaam||ret,htmllist)
  134.         if nr = 0 then
  135.           call NewHTML
  136.         else do
  137.           startnr = lastpos(ret,htmllist,nr)+1
  138.           saveto = substr(htmllist,startnr,nr-startnr-1)
  139.           hit=hit+1
  140.         end
  141.  
  142.       end
  143.   end
  144. end
  145.  
  146. if hit>0 then do
  147.   if hit ~= 2 then
  148.     saveto=cachedir'HTMLs/'saveto
  149.   else
  150.     do n=1 until ~exists(saveto)
  151.       saveto='T:temphtml'n
  152.     end
  153.   nr = lastpos('/',urlnaam)
  154.   urlstam = left(urlnaam,nr)
  155.   nr = pos('/',urlstam,8)
  156.   urlroot = left(urlstam,nr-1)
  157.  
  158.   address AMOSAIC.1 'fetch source'
  159.   inhoud = result
  160.   nr = max(pos('<html>',inhoud),pos('<HTML>',inhoud))
  161.   if nr > 1 then
  162.     inhoud = substr(inhoud,nr)
  163.   call ChkLinks
  164.   zkinhoud=''
  165.  
  166.   call ChkCache
  167.   call open(4output,saveto,'W')
  168.   call writech(4output,inhoud)
  169.   call close(4output)
  170.   inhoud=''
  171.  
  172.   address AMOSAIC.1 'jump url file://localhost/'saveto
  173.   do i=1 for image.0
  174.     if nieuw.i > 0 then
  175.       address AMOSAIC.1 'fetch inline url file://localhost/'cachedir'Images/'nieuw.i
  176.   end
  177.   if hit=2 then
  178.     call delete(saveto)
  179.  
  180. end
  181. exit 0
  182.  
  183. NewHTML:
  184.   nr = lastpos('/',urlnaam)
  185.   bestand = substr(urlnaam,nr+1)
  186.   address AMOSAIC.1 'fetch title'
  187.   titel = result
  188.   if bestand = '' then
  189.     bestand=titel
  190.  
  191.   q=0
  192.   do until q>0
  193.     address command 'SetEnv filenaam `RequestFile 'dir' File "'bestand'" Title "Save HTML document as..." SaveMode`'
  194.     bestand = getvar('filenaam')
  195.     call deletevar('filenaam')
  196.     if bestand = '' then
  197.       q=1
  198.     else do
  199.       nr = lastpos('/',bestand)
  200.       if left(bestand,nr) = dir then
  201.         if ~exists(bestand) then
  202.           q=2
  203.     end
  204.   end
  205.  
  206.   if q=2 then do
  207.     saveto = substr(bestand,nr+1)
  208.     hit=hit+1
  209.     address command 'Echo >>'cachedir'HTMLlist "'saveto','urlnaam'"'
  210.     htmllist=htmllist||saveto','urlnaam||ret
  211.     address command 'Echo >>'cachedir'Cache.html "<A HREF=*"HTMLs/'saveto'*">'titel'</A><BR>"'
  212.  
  213.     zoek=urlnaam
  214.     vervang='file://localhost/'dir||saveto
  215.     call MultiFR
  216.   end
  217. return 0
  218.  
  219. RemHTML:
  220.   type=0
  221.   tekst=cachedir'HTMLs/'
  222.   nr = pos(tekst,urlnaam)
  223.   if nr > 0 then
  224.     HTML = substr(urlnaam,nr+length(tekst))
  225.   else
  226.     HTML=urlnaam
  227.   call WisItem
  228.  
  229.   type=1
  230.   address AMOSAIC.1 'fetch images IMAGE'
  231.   do i=1 for image.0
  232.     if image.i.current then do
  233.       tekst=cachedir'Images/'
  234.       nr = pos(tekst,image.i.url)
  235.       if nr > 0 then
  236.         Image = substr(image.i.url,nr+length(tekst))
  237.       else
  238.         Image=image.i.url
  239.       call WisItem
  240.     end
  241.  
  242.   end
  243. return 0
  244.  
  245. ChkLinks:
  246.   delta=0
  247.   zkinhoud = upper(inhoud)
  248.   zoeknr = pos('HREF=',zkinhoud)
  249.   do while zoeknr > 0
  250.  
  251.     nr = zoeknr-lastpos('<A',zkinhoud,zoeknr)-2
  252.     zoeknr=zoeknr+5
  253.     if nr=1 | nr=2 then do
  254.  
  255.       if substr(zkinhoud,zoeknr,1) = '"' then
  256.         zoeknr=zoeknr+1
  257.       else do
  258.         inhoud = insert('"',inhoud,zoeknr+delta-1)
  259.         delta=delta+1
  260.       end
  261.       stopnr = pos('>',zkinhoud,zoeknr)
  262.       zklen=stopnr-zoeknr
  263.  
  264.       urlnaam = substr(zkinhoud,zoeknr,zklen)
  265.       if pos(':',urlnaam) = 0 then
  266.         call ReplUrl
  267.       if right(urlnaam,1) ~= '"' then do
  268.         inhoud = insert('"',inhoud,stopnr+delta-1)
  269.         delta=delta+1
  270.       end
  271.  
  272.      end
  273.     else
  274.       zklen=1
  275.  
  276.     zoeknr = pos('HREF=',zkinhoud,zoeknr+zklen)
  277.   end
  278.  
  279.   delta=0
  280.   zkinhoud = upper(inhoud) '"'
  281.   zoeknr = pos('SRC=',zkinhoud)
  282.   do while zoeknr > 0
  283.  
  284.     nr = substr(zkinhoud,zoeknr-1,1)
  285.     zoeknr=zoeknr+4
  286.     if nr=' ' | nr=ret then do 
  287.  
  288.       if substr(zkinhoud,zoeknr,1) = '"' then
  289.         zoeknr=zoeknr+1
  290.       else do
  291.         inhoud = insert('"',inhoud,zoeknr+delta-1)
  292.         delta=delta+1
  293.       end
  294.       stopnr = min(pos('"',zkinhoud,zoeknr),pos(' ',zkinhoud,zoeknr),pos(ret,zkinhoud,zoeknr))+1
  295.       zklen=stopnr-zoeknr
  296.  
  297.       urlnaam = substr(zkinhoud,zoeknr,zklen)
  298.       if pos('://',urlnaam) = 0 then
  299.         call ReplUrl
  300.       if right(urlnaam,1) ~= '"' then do
  301.         inhoud = insert('"',inhoud,stopnr+delta-2)
  302.         delta=delta+1
  303.       end
  304.  
  305.      end
  306.     else
  307.       zklen=1
  308.  
  309.     zoeknr = pos('SRC=',zkinhoud,zoeknr+zklen)
  310.   end
  311.  
  312.   delta=0
  313.   zkinhoud = upper(inhoud)
  314.   zoeknr = pos('ACTION="',zkinhoud)
  315.   do while zoeknr > 0
  316.  
  317.     zoeknr=zoeknr+8
  318.     stopnr = pos('"',zkinhoud,zoeknr)
  319.     zklen=stopnr-zoeknr
  320.  
  321.     urlnaam = substr(zkinhoud,zoeknr,7)
  322.     if urlnaam ~= 'HTTP://' then
  323.       call ReplUrl
  324.  
  325.     zoeknr = pos('ACTION="',zkinhoud,zoeknr+zklen)
  326.   end
  327. return 0
  328.  
  329. ReplUrl:
  330.   if left(urlnaam,1) ~= '#' then do
  331.     if left(urlnaam,1) ~= '/' then
  332.       tekst=urlstam
  333.     else
  334.       tekst=urlroot
  335.  
  336.     inhoud = insert(tekst,inhoud,zoeknr+delta-1)
  337.     delta=delta+length(tekst)
  338.   end
  339. return 0
  340.  
  341. ChkCache:
  342.   do i=1 for image.0
  343.     if nieuw.i > 0 then do
  344.       nr = pos(image.i.url'"',inhoud)
  345.       inhoud = delstr(inhoud,nr,length(image.i.url))
  346.       inhoud = insert('file://localhost/'cachedir'Images/'nieuw.i,inhoud,nr-1)
  347.     end
  348.   end
  349.  
  350.   if hit ~= 2 then do
  351.     address AMOSAIC.1 'fetch links HREF'
  352.     do i=1 for href.0
  353.       nr = pos(href.i.url||ret,htmllist)
  354.       if nr > 0 then do
  355.         startnr = lastpos(ret,htmllist,nr)+1
  356.         bestand = substr(htmllist,startnr,nr-startnr-1)
  357.  
  358.         nr = pos(href.i.url,inhoud)
  359.         do while nr > 0
  360.           zklen=length(href.i.url)
  361.           tekst=substr(inhoud,nr+zklen,1)
  362.  
  363.           if tekst='#' | tekst='"' then do
  364.             inhoud = delstr(inhoud,nr,zklen)
  365.             inhoud = insert('file://localhost/'cachedir'HTMLs/'bestand,inhoud,nr-1)
  366.           end
  367.  
  368.           nr = pos(href.i.url,inhoud,nr+zklen)
  369.         end
  370.  
  371.       end
  372.     end
  373.  
  374.   end
  375. return 0
  376.  
  377. AllesWeg:
  378.   address command
  379.   'Echo >'cachedir'ImageList'
  380.   'Echo >'cachedir'NrOfImage 0'
  381.   'Delete 'cachedir'Images/#?'
  382.  
  383.   'Echo >'cachedir'HTMLlist'
  384.   'Echo >'cachedir'Cache.html "<HTML><HEAD><TITLE>Available cached documents</TITLE></HEAD><BODY>"'
  385.   'Delete 'cachedir'HTMLs/#?'
  386. return 0
  387.  
  388. WisItem:
  389.   if type then do
  390.     nr = pos('://',Image)
  391.     if nr > 0 then
  392.       zoek=','Image||ret
  393.     else
  394.       zoek=ret||Image','
  395.     listfile=cachedir'ImageList'
  396.     dir=cachedir'Images/'
  397.  
  398.    end
  399.   else do
  400.     nr = pos('://',HTML)
  401.     if nr > 0 then
  402.       zoek=','HTML||ret
  403.     else
  404.       zoek=ret||HTML','
  405.     listfile=cachedir'HTMLlist'
  406.     dir=cachedir'HTMLs/'
  407.   end
  408.  
  409.   call open(1input,listfile,'R')
  410.   list = ret||readch(1input,65534)
  411.   call close(1input)
  412.  
  413.   nr = pos(zoek,list)
  414.   if nr = 0 then
  415.     say zoek 'not found in' listfile
  416.   else do
  417.     startnr = lastpos(ret,list,nr)+1
  418.     midnr = pos(',',list,startnr)
  419.     stopnr = pos(ret,list,midnr)+1
  420.  
  421.     bestand = substr(list,startnr,midnr-startnr)
  422.     urlnaam = substr(list,midnr+1,stopnr-midnr-2)
  423.     call delete(dir||bestand)
  424.     say dir||bestand 'with URL:' urlnaam 'deleted.'
  425.  
  426.     list = delstr(list,startnr,stopnr-startnr)
  427.     call open(1output,listfile,'W')
  428.     call writech(1output,substr(list,2))
  429.     call close(1output)
  430.  
  431.     if ~type then do
  432.       call open(5input,cachedir'Cache.html','R')
  433.       list = readch(5input,65535)
  434.       call close(5input)
  435.  
  436.       nr = pos('HTMLs/'bestand,list)
  437.       startnr = lastpos(ret,list,nr)+1
  438.       stopnr = pos(ret,list,nr)+1
  439.  
  440.       list = delstr(list,startnr,stopnr-startnr)
  441.       call open(5output,cachedir'Cache.html','W')
  442.       call writech(5output,list)
  443.       call close(5output)
  444.     end
  445.  
  446.     zoek='file://localhost/'dir||bestand
  447.     vervang=urlnaam
  448.     dir=cachedir'HTMLs/'
  449.     call MultiFR
  450.   end
  451. return 0
  452.  
  453. MultiFR:
  454.   files = showdir(dir,'FILES',',')
  455.   if files = '' then
  456.     return 0
  457.   else
  458.     files=files','
  459.  
  460.   startnr=1
  461.   stopnr = pos(',',files)
  462.   do until stopnr = 0
  463.     bestand = substr(files,startnr,stopnr-startnr)
  464.  
  465.     call open(6input,dir||bestand,'R')
  466.     inhoud = readch(6input,65535)
  467.     call close(6input)
  468.  
  469.     q=0
  470.     nr = pos(zoek,inhoud)
  471.     do while nr > 0
  472.       zklen=length(zoek)
  473.       tekst=substr(inhoud,nr+zklen,1)
  474.  
  475.       if tekst='#' | tekst='"' then do
  476.         q=1
  477.         inhoud = delstr(inhoud,nr,zklen)
  478.         inhoud = insert(vervang,inhoud,nr-1)
  479.         zklen=length(vervang)
  480.       end
  481.  
  482.       nr = pos(zoek,inhoud,nr+zklen)
  483.     end
  484.  
  485.     if q then do
  486.       call open(6output,dir||bestand,'W')
  487.       call writech(6output,inhoud)
  488.       call close(6output)
  489.       say dir||bestand 'updated.'
  490.     end
  491.  
  492.     startnr=stopnr+1
  493.     stopnr = pos(',',files,startnr)
  494.   end
  495.   inhoud=''
  496. return 0
  497.  
  498.